﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;

namespace xlsx2const.XlsxReadModule.DefinitionType
{
    class IndexDefinition
    {
        /** テーブル論理名 */
        private static string TABLE_COMMENT = "H1";
        /** テーブル物理名 */
        private static string TABLE_NAME = "H2";
        /** インデックス物理名 */
        private static string INDEX_NAME = "H3";
        /** 最初のカラム物理名 */
        private static string COLOMUN_NAME = "M";
        private static int FIRST_COLOMUN_LINE_NUM = 8;

        public static string getEntityString(string fullPath)
        {
            // 入力チェック
            if (fullPath == null) { return ""; }

            // xlsxドキュメントを読み込み
            SpreadsheetDocument document = ReaderCommon.getDoc(fullPath);

            // WorkbookPartを取得
            WorkbookPart wbPart = ReaderCommon.getWbPart(document);

            // シートのリストを取得
            List<string> sList = ReaderCommon.getSheetList(document, wbPart);
            // エンティティ定義書のシート数は1つしか無いはず
            int sCnt = sList.Count;
            if (sCnt == 0)
            {
                // シートが取得できない旨のメッセージを表示したい
                // TODO★
                return "";
            }
            StringBuilder sql = new StringBuilder("");
            StringBuilder alt = new StringBuilder("");
            StringBuilder clm = new StringBuilder("");

            for (int i = 0; i < sCnt; i++)
            {
                // Sheet1という名前のオブジェクトを取得
                Sheet targetSheet =
                    wbPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sList[i]).FirstOrDefault();
                if (targetSheet == null)
                {
                    return "";
                }

                // SheetからIDを取得し、WorksheetPartを得る
                WorksheetPart wsPart = (WorksheetPart)(wbPart.GetPartById(targetSheet.Id));

                string tableCmnt = ReaderCommon.getCellValue(wsPart, TABLE_COMMENT);
                string tableNm = ReaderCommon.getCellValue(wsPart, TABLE_NAME);
                string idxName = ReaderCommon.getCellValue(wsPart, INDEX_NAME);

                bool isContinue = true;
                int rownum = FIRST_COLOMUN_LINE_NUM;
                string clmNm = "";
                
                clm.Clear();

                while (isContinue)
                {
                    // カラム物理名の取得
                    clmNm = ReaderCommon.getCellValue(wsPart, COLOMUN_NAME + rownum.ToString());
                    if (ReaderCommon.isEmpty(clmNm))
                    {
                        // ここに入るときは""の時
                        break;
                    }

/*
CREATE UNIQUE INDEX PK_FMS_PR_PLAN ON FMS_PR_PLAN (journal_id,balance_type,line_no,reconcile_branch_no);
CREATE INDEX FK_FMS_PR_DTL_IDX0 ON FMS_PR_DTL (journal_id,balance_type,line_no,reconcile_branch_no);

ALTER TABLE fms_pr_plan ADD CONSTRAINT PK_fms_pr_plan PRIMARY KEY (journal_id,balance_type,line_no,reconcile_branch_no);
*/
                    if (rownum == FIRST_COLOMUN_LINE_NUM)
                    {
                        clm.Append(clmNm);
                    }
                    else
                    {
                        sql.Append("," + clmNm);
                    }
                    rownum++;
                }
                if (clm.Length > 0)
                {
                    if (idxName.ToUpper().StartsWith("PK"))
                    {
                        sql.Append("CREATE UNIQUE INDEX " + idxName + " ON " + tableNm + "  (" + clm.ToString() + ");\n");
                        alt.Append("ALTER TABLE " + tableNm + " ADD CONSTRAINT " + idxName + " PRIMARY KEY (" + clm.ToString() + ");\n");
                    }
                    else
                    {
                        sql.Append("CREATE INDEX " + idxName + " ON " + tableNm + "  (" + clm.ToString() + ");");
                        if (idxName.ToUpper().StartsWith("FK"))
                        {
                            //TODO
                        }
                        
                    }
                }
            }
            // ファイルを閉じる
            document.Close();

            sql.Append(");\n\n");

            return sql.ToString() + comment.ToString() + "\n";
        }
    }
}
